package com.tmt.spring.validation;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
import java.util.regex.Pattern;

/**
 * 用户注册信息校验帮助类
 */
public class RegisterValidateHelper {


    /**
     * 账号必须为：长度介于6-15，且仅以"_"、字母、数字组成的字符串。
     *
     * @param username
     */
    @ValidateRule("6-15个字母、数字或下划线")
    public static boolean validateUsername(String username) {
        Pattern pattern = Pattern.compile("^[_a-zA-Z0-9]\\w{5,14}$");
        return pattern.matcher(username).matches();
    }

    /**
     * 账号密码必须：长度在6~15之间，只能包含字符、数字和下划线
     *
     * @param password
     */
    @ValidateRule("6-15个字母、数字或下划线")
    public static boolean validatePassword(String password) {
        Pattern pattern = Pattern.compile("^[_a-zA-Z0-9]\\w{5,14}$");
        return pattern.matcher(password).matches();
    }

    /**
     * 账号密码必须：长度在6~15之间，只能包含字符、数字和下划线, 且必须大小写字母和数字同时存在
     *
     * @param password
     */
    @ValidateRule("6-15个字母、数字或下划线，且同时包含大小写字母和数字")
    public static boolean validatePasswordEx(String password) {
        if (!validatePassword(password))
            return false;
        Pattern pattern1 = Pattern.compile("^.*\\d+.*$");
        Pattern pattern2 = Pattern.compile("^.*[A-Z]+.*$");
        Pattern pattern3 = Pattern.compile("^.*[a-z]+.*$");
        return pattern1.matcher(password).matches()
                && pattern2.matcher(password).matches()
                && pattern3.matcher(password).matches();
    }

    @ValidateRule("必须与设定的帐号密码相同")
    public static boolean validateVerify(String verify, String password) {
        return verify.equals(password);
    }

    /**
     * 真实姓名必须满足正则表达式：以2-10个汉字开头，后跟0-2个数字
     *
     * @param realName
     */
    @ValidateRule("2-10个汉字开头，后跟0-2个数字")
    public static boolean validateRealName(String realName) {
        Pattern pattern = Pattern.compile("^[\u4e00-\u9fa5]{2,10}\\w*$");
        return pattern.matcher(realName).matches();
    }

    /**
     * 验证第二代身份证号码
     *
     * @param idCardNum
     * @return
     */
    @ValidateRule("18位，检测省级代码、出生日期和校验位")
    public static int validateIdCard2(String idCardNum) {
        return IdCardNumHelper.checkIdCard2(idCardNum);
    }

    /**
     * 验证香港身份证号码
     *
     * @param idCardNum
     * @return
     */
    @ValidateRule("8-9位，检测校验位")
    public static int validateIdCard_HK(String idCardNum) {
        return IdCardNumHelper.checkIdCard_HK(idCardNum);
    }

    /**
     * 验证台湾身份证号码
     *
     * @param idCardNum
     * @return
     */
    @ValidateRule("10位，检测校验位")
    public static boolean validateIdCard_TW(String idCardNum) {
        return IdCardNumHelper.checkIdCard_TW(idCardNum);
    }

    /**
     * 验证澳门身份证号码
     *
     * @param idCardNum
     * @return
     */
    @ValidateRule("8位，以1、5或7开头连续7位数字，第8位为数字或大写字母")
    public static boolean validateIdCard_AM(String idCardNum) {
        return IdCardNumHelper.checkIdCard_AM(idCardNum);
    }

    /**
     * 验证第二代身份证和出生日期是否一致。
     *
     * @param birthDay  用户提供的出生日期
     * @param idCardNum 有效的第二代身份证号码
     */
    @ValidateRule("若是二代证，则要求与二代证内的出生日期保持一致")
    public static boolean validateBirthday(Date birthDay, String idCardNum) {
        if (idCardNum.length() != 18)
            return true;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return Objects.equals(idCardNum.substring(6, 14), sdf.format(birthDay));
    }

    /**
     * 手机号码必须满足正则表达式：^((13[0-9])|(15[^4,\D])|(17[0-9])|(18[0-9]))\d{8}$
     * 移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
     * 联通：130、131、132、152、155、156、185、186
     * 电信：133、153、177、180、189、（1349卫通）
     *
     * @param mobile
     */
    @ValidateRule("11位数字，检测前3位数字组合的有效性")
    public static boolean validateMobile(String mobile) {
        Pattern pattern = Pattern.compile("^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$");
        return pattern.matcher(mobile).matches();
    }

    @ValidateRule("要求符合电子邮箱的正确格式")
    public static boolean validateEmail(String email) {
        // 绑定邮箱：必须匹配正则表达式
        Pattern pattern = Pattern.compile("^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$");
        return pattern.matcher(email).matches();
    }

}
